#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

/**
标准输出重定向
1. 正常输出重定向到log.txt
2. 错误输出重定向到error.txt
 */

int main(int argc, char const *argv[])
{
    // 关闭标准输出和标准错误输出
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    //  打开指向特定文件的文件描述符
    open("log.txt", O_CREAT|O_RDWR|O_APPEND, 0644);  // fd 1 => 新的标准输出
    open("error.txt", O_CREAT|O_RDWR|O_APPEND, 0644); // fd 2 => 新的标准错误输出

    // 使用stdin得到控制台输入
    char input_buf[20];
    fgets(input_buf, 20, stdin);  // 阻塞读取
    printf("使用stdin得到控制台输入: %s\n", input_buf);
    

    // 使用stdout输出到控制台
    fputs("使用stdout输出到控制台(正常内容)\n", stdout); 
    fflush(stdout); // 刷新缓冲区，将数据写入文件
    // 使用stderr输出到控制台
    fputs("使用stderr输出到控制台(错误内容)\n", stderr);

    // 使用STDIN_FILENO得到控制台输入
    char input_buf2[20];
    read(STDIN_FILENO, input_buf2, 20);
    printf("使用STDIN_FILENO得到控制台输入: %s\n", input_buf2);
    // 使用STDOUT_FILENO输出到控制台(正常内容)
    char *str = "使用STDOUT_FILENO输出到控制台(正常内容)\n";
    write(STDOUT_FILENO, str, strlen(str)+1);
    // 使用STDERR_FILENO输出到控制台(错误内容)
    char *str2 = "使用STDERR_FILENO输出到控制台(错误内容)\n";
    write(STDERR_FILENO, str2, strlen(str2)+1);
    return 0;
}
